package common.util;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class SplitAndExtractText {
    static List<String> pageHand = new ArrayList<>();
    static List<String> pageEnd = new ArrayList<>();
    static List<String> pageStart = new ArrayList<>();

    {

        pageHand.add("国家自然科学基金项目申请书");
        pageHand.add("国家自然科学基金项目计划书");
        pageHand.add("国家自然科学基金资助项目进展报告");

        //正文报告结束的标识

        pageEnd.add("签字和盖章");
        pageEnd.add("国家自然科学基金资助项目签批审核表");
        pageEnd.add("项目负责人签字及部门审核意见表");

        //正文标识

        pageStart.add("报告正文");
        pageStart.add("报 告 正 文");
        pageStart.add("申请书正文");
    }

    public static void main(String[] args) {
        String fileName = "/Users/zhangfulei/Downloads/file/2003_面上项目_表面富含高分散非毗邻过渡金属氧结构单元的沸石分子筛类新型光催化剂的研究.pdf";
        String s = cutPDF(fileName);
        System.out.println(s);
    }

    public static String cutPDF(String fileName) {
        try {

            File pdfFile = new File(fileName);
            PDDocument document = Loader.loadPDF(pdfFile);

            PDFTextStripper pdfStripper = new PDFTextStripper();

            //要忽略的页眉标识


//            //参考文献结束,正文继续的标识
//            List<String> pageNext = new ArrayList<>();
//            pageNext.add("项目的研究内容、研究目标,以及拟解决的关键问题");
//            pageNext.add("项目负责人签字及部门审核意见表");
//            pageNext.add("学术交流");
//            pageNext.add("项目的研究内容、研究目标，以及拟解决的关键科学问题");
//            pageNext.add("项目的研究内容、研究目标,以及拟解决的关键科学问题");
//
//            //开始参考文献的标识
//            List<String> pageRef = new ArrayList<>();
//            pageRef.add("参考文献");
//            pageRef.add("主要参考文献");
//            pageRef.add("近期相关论文");
            //正文标识


            //获取正文开始页码
            int startPage = 0;
            for (int k = 0; k < document.getNumberOfPages(); k++) {
                pdfStripper.setStartPage(k + 1);
                pdfStripper.setEndPage(k + 1);
                String text = pdfStripper.getText(document);
                String[] split = text.split("\n");
                for (String s : split) {
                    if (isContains(pageStart, s)) {
                        startPage = k;
                        break;
                    }
                }
            }


            StringBuilder stringBuilder = new StringBuilder();
            A:
            for (int i = startPage; i < document.getNumberOfPages(); i++) {
                pdfStripper.setStartPage(i + 1);
                pdfStripper.setEndPage(i + 1);
                String text = pdfStripper.getText(document);
                //System.out.println("Page " + (i + 1) + ":\n");
                //去掉页数显示
                String pattern = "第\\s*\\d+\\s*页\\s*共\\s*\\d+\\s*页";
                Pattern regex = Pattern.compile(pattern);
                Matcher matcher = regex.matcher(text);
                String result = matcher.replaceAll("");

                //剩下的每一行读取
                String[] split = result.split("\n");
                for (String s : split) {

                    if (!isContains(pageHand, s)) {//如果不是页眉
                        if (!isContains(pageEnd, s)) {//如果不是结束标识
                            if (s.length() > 5) {
                                stringBuilder.append(s).append("\n");
                            }
                        } else {
                            break A;
                        }
                    }
                }
            }


            document.close();


            return stringBuilder.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return "";
    }


    public static String readDocFile(String filePath) {
        StringBuilder content = new StringBuilder();

        try {
            FileInputStream fis = new FileInputStream(filePath);
            HWPFDocument document = new HWPFDocument(fis);
            WordExtractor extractor = new WordExtractor(document);

            String[] paragraphs = extractor.getParagraphText();

            boolean next = false;
            for (String s : paragraphs) {

                if (isContains(pageStart, s)) {
                    next = true;

                }
                if (next) {
                    if (!isContains(pageHand, s)) {//如果不是页眉
                        if (!isContains(pageEnd, s)) {//如果不是结束标识
                            if (s.length() > 5) {
                                content.append(s).append("\n");
                            }
                        } else break;
                    }
                }
            }

            extractor.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return content.toString();
    }

    public static boolean isContains(List<String> list, String s) {
        s = s.trim().toUpperCase(Locale.ROOT);
        for (String s1 : list) {
            s1 = s1.trim().toUpperCase(Locale.ROOT);
            if (s.contains(s1)) {
                return true;
            }
        }
        return false;
    }
}
